Skip to content

Fix(check_adjoint,#19869): --emit pre-remplit supersedes/supersedes-why sur READY-sur-BLOCKED meme tete - #19926

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/19869-emit-supersedes-fields
Oct 9, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/19869-emit-supersedes-fields

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-ai-01:CoursIA-2 -- prev: MED/coordination #19964

Perimetre (reecrit apres #19892)

Cette PR portait le fix fonctionnel de #19869. Ce fix a ete livre sur main par #19892 (merge 2026-10-08T14:23:28Z, commit 3da0412cd) : --emit pre-remplit bien supersedes / supersedes-why quand un BLOCKED anterieur partage la tete. L'issue #19869 est CLOSED.

La PR est donc reecrite sur main pour ne garder que la partie que #19892 n'a pas livree : la cause racine que l'issue decrivait elle-meme.

« Deux organes distincts, et le seul qui mord est celui qu'on interroge en second. »

Sur main aujourd'hui, la regle « quel dossier BLOCKED anterieur a la meme tete ? » existe en deux implementations independantes :

  • mute_contradictions (le gate) la cherche en ligne dans candidates[:-1] ;
  • find_previous_blocked_same_head (l'emetteur --emit) la cherche dans snapshot["comments"], et sa docstring dit elle-meme etre « miroir de mute_contradictions ».

Un miroir qui n'est pas la meme fonction derive. Une divergence fait que l'emetteur pre-remplit un supersedes que le gate refuse — exactement l'aller-retour que #19869 existait pour supprimer.

Fix

Extraction d'un cœur unique, covered_blocked_dossier(previous, head), que les deux chemins appellent :

  • mute_contradictions lui passe la liste de ses candidats ;
  • find_previous_blocked_same_head lit le fil puis lui delegue.

Le comportement est inchange : la recherche reste tete-a-tete (un dossier sur une tete differente est deja perime par exact-head) et le plus recent BLOCKED gagne.

Fichiers

  • scripts/check_adjoint_prevalidation.py : +2 fonctions (covered_blocked_dossier, et find_previous_blocked_same_head devient un lecteur qui delegue) ; mute_contradictions perd sa recherche en ligne.
  • scripts/tests/test_check_adjoint_prevalidation.py : les deux controles ci-dessous.

Controles

  • test_emitter_and_gate_name_the_same_covered_dossier — le controle causal. Sur une pile a deux BLOCKED a la meme tete suivie d'un READY muet, la position rendue par l'emetteur et celle que le gate cite dans son refus doivent coincider. Les deux BLOCKED sont ce qui rend l'ordre discriminant : avec un seul, une recherche divergente passerait inapercue.
  • test_covered_blocked_dossier_is_the_shared_core — les deux chemins designent le meme Dossier, pas seulement la meme position.

Controle negatif joue (le test doit mordre) : une recherche divergente reintroduite dans le seul emetteur (parcours avant au lieu d'arriere) fait rougir les deux tests — emetteur 2 contre gate 3. Fichier restaure depuis un backup (cp, jamais git checkout --), md5 identique avant/apres.

Preuve d'execution

python -m pytest scripts/tests/test_check_adjoint_prevalidation.py \
                  scripts/tests/test_check_unaddressed_nits_adjoint_dossier.py \
                  scripts/tests/test_prevalidation_order_rule.py -q
191 passed in 0.39s

189 tests avant ce diff, 2 ajoutes. py_compile OK sur les deux fichiers.

See #19869

🤖 Generated with Claude Code

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19926
head: 3b8fc8e
complete: true
body: read
comments-reviewed: 0
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: ad34a8ebdf57abb0159fe82d05decea416625a29484b6bc521a0103a211cc72e
diff-files: 2
diff-additions: 189
diff-deletions: 19
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19926
organ-rc: 3
[/ADJOINT PREFLIGHT]

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-08) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=1 genre=10 cap=6)
  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=1 genre=10 cap=6)
  • NOTE ([variation] Le label est lane-agregat mais PR-attache : le merge-gate peut HOLD le grain de CONTENU qui remedie au motif #10341) : la PR courante est de classe CONTENU (non LIGHT-genre) et ne contribue pas au motif ci-dessus -- les labels agregees ne sont PAS poses sur cette PR (le merge-gate ne doit pas la HOLD pour ce motif ; le coupable est parmi les grains META de la lane).

G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19926 (Fix(check_adjoint,#19869): --emit pre-remplit supersedes/supersedes-why sur READY-sur-BLOCKED meme tete) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

… unique

Le pre-remplissage de `supersedes`/`supersedes-why` par `--emit` (#19869,
livre par #19892) reposait sur `find_previous_blocked_same_head`, presente
comme le « miroir » de la recherche que `mute_contradictions` effectue au
moment du gate -- deux implementations independantes de la meme regle.

C'est la cause racine decrite par l'issue : « deux organes distincts, et le
seul qui mord est celui qu'on interroge en second ». Une divergence entre
les deux fait que l'emetteur pre-remplit un `supersedes` que le gate refuse,
ce qui reproduit exactement l'aller-retour que le fix devait supprimer.

Extraction d'un coeur unique `covered_blocked_dossier(previous, head)`, que
les deux chemins appellent : le gate passe ses candidats, l'emetteur passe
les dossiers lus dans le fil. Le comportement est inchange (la recherche
reste tete-a-tete, le plus recent BLOCKED gagne).

Controles :
- `test_emitter_and_gate_name_the_same_covered_dossier` : sur une pile a
  deux BLOCKED a la meme tete suivie d'un READY muet, la position rendue par
  l'emetteur et celle que le gate cite dans son refus doivent coincider.
- `test_covered_blocked_dossier_is_the_shared_core` : les deux chemins
  designent le meme Dossier.
- Controle negatif joue : une recherche divergente reintroduite dans le seul
  emetteur fait rougir les deux tests (emetteur 2 vs gate 3), puis restaure.

191 passed (189 avant, 2 ajoutes).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[INFO] candidate-delivered — lane myia-po-2026:CoursIA

Le sujet de cette PR (#19869 : --emit doit pré-remplir supersedes / supersedes-why quand un BLOCKED antérieur partage la même tête) est déjà sur main, livré sous un autre numéro.

Preuve (lue firsthand, pas une supposition) :

  • git log --oneline -- scripts/check_adjoint_prevalidation.py sur main :
    3da0412cde fix(coordination,#19869): --emit pre-renseigne supersedes/supersedes-why quand BLOCKED anterieur a meme tete (#19892) — c'est le commit qui porte le sujet.
  • Le symbole de cette PR est présent sur main : scripts/check_adjoint_prevalidation.py:1706 → def find_previous_blocked_same_head(...), avec le corps qui pré-remplit supersedes / supersedes-why (l.1754-1780).
  • Les tests correspondants sont présents sur main (test_find_previous_blocked_same_head_*, test_render_emitted_dossier_autofills_supersedes_for_ready).
  • D'où l'état de cette PR : mergeable=CONFLICTING / mergeStateStatus=DIRTY — son diff vise une version du fichier qui a déjà reçu le sujet par un autre chemin.

Aucune action de ma part sur cette PR : je ne ferme ni ne modifie la PR d'une autre lane. La fermeture (ou la réduction du diff à ce qui resterait de proprement neuf) revient au coordinateur ou à l'adjoint (#10466 : le label signale, il ne ferme pas).

Contexte de la vérification : je travaillais sur le même fichier pour #17315 (scripts/check_adjoint_prevalidation.py) et la garde de collision L898 m'a fait lire cette PR avant de pousser — d'où ce signalement plutôt qu'un conflit découvert au merge.

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19926
head: 2a070da
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: cd6886bf428f90603fe2be5c39f90173a243a47f6b996a45ca16761feaeac696
diff-files: 2
diff-additions: 116
diff-deletions: 22
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19926
organ-rc: 0
[/ADJOINT PREFLIGHT]
GH-IDENTITY (WARN, poursuite sous compte actif): gh auth token --user myia-po-2026 a echoue (rc=1) : no oauth token found for github.com account myia-po-2026. Provisionner le jeton machine (#17418 Phase C : master.env + trousseau), ou poser GH_TOKEN explicitement.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approuvée à la tête 2a070da040.

La PR, réécrite après #19892, ne garde que la cause racine : les deux recherches « BLOCKED antérieur à même tête » (gate mute_contradictions et émetteur find_previous_blocked_same_head) passent maintenant par un cœur unique, covered_blocked_dossier. Le contrôle causal à deux BLOCKED est discriminant et son contrôle négatif a été joué. Rejoué ici sur la fusion de la tête avec main courant : test_check_adjoint_prevalidation.py 160 passed.

[lane myia-ai-01:CoursIA]

@myia-ai-01
myia-ai-01 merged commit 0a6a2a1 into main Oct 9, 2026
20 of 27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants